package com.lagou.bak.base;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

/**
 * 泛型demo
 * .<>methodName()
 * 6.22 lucas
 */
public class GenericityDemo {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        ArrayList<String> strings = new ArrayList<>();
        ArrayList<Integer> integers = new ArrayList<>();
        System.out.println(strings.getClass().getName());
        System.out.println(integers.getClass().getName());
        //输出
        //java.util.ArrayList
        //java.util.ArrayList

        integers.add(1);
//        integers.add("lucas");//Required type:Integer Provided:String 编译的时候通不过
        integers.getClass().getMethod("add", Object.class).invoke(integers,"abc");
        for (int i = 0; i < integers.size(); i++) {
            System.out.println(integers.get(i));
        }
        //调用泛型方法一：不指定泛型类型，让编译器自动推断
        Integer add = GenericityDemo.add(1, 2);
        Number add1 = GenericityDemo.add(1, 1.2);
        Serializable hello = GenericityDemo.add(1, "hello");
        System.out.println(hello + "..." + hello.getClass().getName());

        //调用泛型方法二：指定泛型类型
        Integer add2 = GenericityDemo.<Integer>add(1, 2);
        //GenericityDemo.<Integer>add(1,1.2);//指定Integer，所以必须传递Integer类型的参数
        Number add3 = GenericityDemo.<Number>add(1, 1.2);

    }

    //定义泛型方法
    public static <T> T add(T x, T y){
        return y;
    }
}
